#pragma once
namespace zyq
{
	//template<class Iterator, class Ref, class Ptr>
	//struct ReverseIterator
	//{
	//	typedef ReverseIterator<Iterator, Ref, Ptr> Self;
	//	Iterator _it;

	//	ReverseIterator(Iterator it)
	//		:_it(it)
	//	{}

	//	Ref operator*()
	//	{
	//		Iterator tmp = _it;
	//		return *(--tmp);
	//	}

	//	Ptr operator->()
	//	{
	//		return &(operator*());
	//	}

	//	Self& operator++()
	//	{
	//		--_it;
	//		return *this;
	//	}

	//	Self& operator-()
	//	{
	//		++_it;
	//		return *this;
	//	}

	//	bool operator!=(const Self& rit)
	//	{
	//		return _it != rit._it;
	//	}
	//};

	template<class Iterator, class Ref, class Ptr>
	struct ReverseIterator
	{
		typedef ReverseIterator<Iterator, Ref, Ptr> Self;

		Iterator _it;

		ReverseIterator(Iterator it)
			:_it(it)
		{}

		Ref operator*()
		{
			Iterator tmp = _it;
			return *(--tmp);
		}

		Ptr operator->()
		{
			return &(operator*());
		}

		Self& operator++()
		{
			_it--;
			return *this;
		}

		Self& operator--()
		{
			++_it;
			return *this;
		}

		bool operator!=(const Self& s)
		{
			return _it != s._it;
		}
	};
}
